package cl.tinet.trainee;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import cl.tinet.trainee.model.Carro;
import cl.tinet.trainee.model.DetalleCarro;
import cl.tinet.trainee.model.ListaProductos;
import cl.tinet.trainee.model.Producto;
import cl.tinet.trainee.model.Usuario;

@ManagedBean
@SessionScoped
public class EjemploMB implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -6146930484102074626L;
    @EJB
    private ejemploBeanLocal servicio;
    private Usuario usuario;
    private List<Usuario> lUsuario;
    private List<Producto> productoList;
    private String nombreUsuario;
    private String passUsuario;
    private String nombre;
    private String apellido;
    private String userName;
    private String userPass;
    private String nombreEnSesion;
    private String passEnSesion;
    private int idCarro = 0;
    private List<DetalleCarro> listDetalle = new ArrayList<DetalleCarro>();
    private List<ListaProductos> listProductos =
            new ArrayList<ListaProductos>();

    public void init() {
        lUsuario = new ArrayList<Usuario>();

        lUsuario = servicio.listar();

        for (Usuario user : lUsuario) {
            System.out.println("username:  " + user.getNombreUsuario());

        }

    }

    public List<Producto> obtenerProductos() {
        productoList = new ArrayList<Producto>();
        productoList = servicio.listarProductos();
        return productoList;
    }

    public void crearCarro() {
        Carro carro = new Carro();
        String strfecha = getFechaActual();
        Date fechaActual = straDate(strfecha);
        carro.setNomusuCarro("INVITADO");
        carro.setComprafinCarro(0);
        carro.setFechacompraCarro(fechaActual);
        servicio.crearCarro(carro);
        int id = servicio.obtenerIdCarro();
        this.idCarro = id;
        System.out.println("Obtener id carro :" + id);
    }

    public String editarCarro() {
        List<ListaProductos> listPro = new ArrayList<ListaProductos>();
        System.out.println(this.nombreEnSesion);
        if (this.idCarro != 0) {
            this.listDetalle = servicio.obtenerListaDetalleCarro(this.idCarro);
            for (DetalleCarro det : this.listDetalle) {
                Producto producto = new Producto();
                System.out.println("id Carro :" + det.getIdCarroDetalle()
                        + "  idProducto :" + det.getIdProductoDetalle());
                String idProducto = det.getIdProductoDetalle();
                producto = servicio.obtenerProducto(idProducto);

                ListaProductos lPro = new ListaProductos();
                lPro.setCodProducto(producto.getCodProducto());
                lPro.setNombreProducto(producto.getNombreProducto());
                lPro.setPrecioProducto(producto.getPrecioProducto());
                lPro.setCatidadProducto(det.getCantidadDetalle());
                lPro.setTotalProducto(producto.getPrecioProducto());
                lPro.setIdDetalle(det.getIdDetalle());
                lPro.setTotalProducto(det.getCantidadDetalle()
                        * producto.getPrecioProducto());
                listPro.add(lPro);

            }
            System.out.println("nombre en sesion editar carro :"
                    + this.nombreEnSesion);
            if (this.nombreEnSesion != null) {
                

                servicio.asignarUsuarioaCarro(this.idCarro, this.nombreEnSesion);
            }
            this.listProductos = listPro;
        }
        return "editar";
    }

    public void agregaraCarro(Producto producto) {
        System.out.println("id carro :" + this.idCarro);
        /*
         * Validar existencia de producto en la lista de productos agregados
         * 
         * for(ListaProductos lPro:this.listProductos){
         *    if(producto.getCodProducto().equals(lPro.getcodProducto())){
         *      
         *    }else{
         *    //Realizar el proceso normal para agregar carro
         *    }
         * }
         * */
        FacesContext context = FacesContext.getCurrentInstance();
        if (this.idCarro == 0) {
            crearCarro();
            aCarro(producto);
        } else {
            aCarro(producto);
        }
        context.addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_INFO,
                "Se agrego un Producto al carro, Modifique la cantidad en Editar", ""));
    }

    public void aCarro(Producto producto) {
        
        
        System.out.println("Nombre Producto :" + producto.getNombreProducto());
        DetalleCarro detalleCarro = new DetalleCarro();
        detalleCarro.setIdCarroDetalle(this.idCarro);
        detalleCarro.setIdProductoDetalle(producto.getCodProducto());
        detalleCarro.setCantidadDetalle(0);

        
        servicio.ingresarDetalleCarro(detalleCarro);
    }

    public Date straDate(String strFecha) {
        Date fecha = null;
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        try {

            fecha = formatoDelTexto.parse(strFecha);

        } catch (ParseException ex) {

            ex.printStackTrace();

        }
        return fecha;
    }

    public static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(ahora);
    }

    public String validarSesion() {
        boolean error = false;
        String ruta = "login";
        Usuario u = new Usuario();
        u = servicio.obtenerUsuario(this.userName, this.userPass);
        FacesContext context = FacesContext.getCurrentInstance();
        if (u == null) {
            error = true;
        } else {
            if (u.getPass().equals(this.userPass)) {
                System.out.println("pass correcto");
            } else {
                error = true;
            }
        }
        if (error == true) {
            context.addMessage(
                    null,
                    new FacesMessage(
                            FacesMessage.SEVERITY_ERROR,
                            "Error! El Usuario ingresado no existe o el password ingresado no es correcto",
                            ""));
        } else {
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_INFO, "Ingreso Exitoso", ""));
            this.nombreEnSesion = this.userName;
            System.out.println("nombre en sesion :" + this.nombreEnSesion);
            this.passEnSesion = this.userName;
            this.nombre = u.getNombre();
            this.apellido = u.getApellido();

            ruta = "index";
        }
        return ruta;
    }

    public String ingresarCrearCuenta() {
        this.nombreUsuario = null;
        this.passUsuario = null;
        this.nombre = null;
        this.apellido = null;

        return "crearcuenta";
    }

    public String ingresarUsuario() {
        System.out.println("entro a ingresar");
        String ruta = "crearcuenta";
        FacesContext context = FacesContext.getCurrentInstance();
        boolean error = false;
        boolean errorcampos = false;
        if (this.nombreUsuario == null) {
            errorcampos = true;
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Error! El campo nombre Usuario esta vacio", ""));
        }
        if (this.passUsuario == null) {
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Error! El campo Password esta vacio", ""));
        }
        if (this.nombre == null) {
            errorcampos = true;
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Error! El campo nombre esta vacio", ""));
        }

        if (this.apellido == null) {
            errorcampos = true;
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Error! El campo apellido esta vacio", ""));
        }
        if (errorcampos == false) {
            error =
                    servicio.ingresarUsuario(this.nombreUsuario,
                            this.passUsuario, this.nombre, this.apellido);
            if (error == true) {
                context.addMessage(null, new FacesMessage(
                        FacesMessage.SEVERITY_ERROR,
                        "Error! El Usuario ingresado ya existe", ""));
            } else {
                context.addMessage(null, new FacesMessage(
                        FacesMessage.SEVERITY_INFO,
                        "Usuario creado Exitosamente", ""));
                ruta = "index";
            }

        } else {
            ruta = "crearcuenta";
        }

        if (context.getMessageList().size() > 0) {

            return (null);

        }
        return ruta;
    }

    public String cancel() {
        this.userName = null;
        this.userPass = null;

        return "index";
    }

    public String volverIndex() {
        System.out.println("aqui");
        return "index";
    }

    public String salir() {
        this.nombreEnSesion = null;
        this.passEnSesion = null;
        return "logout";
    }

    public String comprar() {
        String ruta = "editar";
        FacesContext context = FacesContext.getCurrentInstance();
        if (this.idCarro != 0) {

            if (this.nombreEnSesion == null) {
                context.addMessage(
                        null,
                        new FacesMessage(
                                FacesMessage.SEVERITY_ERROR,
                                "Error! Debe ingresar al sistema para concretar la compra",
                                ""));
                ruta = "editar";
            } else {
                
                List<Producto> listProducto = servicio.listarProductos();

                for (ListaProductos listPro:this.listProductos) {
                    for (Producto pro:listProducto) {
                        if (pro.getCodProducto().equals(listPro.getCodProducto())) {
                           String codProducto = listPro.getCodProducto();
                           int stock = pro.getStockProducto();
                           int cantidad = listPro.getCatidadProducto();
                           int stockTotal = stock-cantidad;
                           servicio.actualizarCantidadProductosStock(codProducto, stockTotal);
                        }
                    }
                }
                
                servicio.actualizarCarroCompra(this.idCarro);
                this.idCarro = 0;
                this.listProductos = null;
                context.addMessage(null, new FacesMessage(
                        FacesMessage.SEVERITY_INFO,
                        "Compra realizada Exitosamente", ""));
                ruta = "compraexito";
            }

        } else {
            context.addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Error! no exite un Carro de compra", ""));
        }
        return ruta;
    }

    public String eliminarDetalle(ListaProductos productoEnLista) {
        int idDetalle = productoEnLista.getIdDetalle();
        this.listProductos.remove(productoEnLista);
        servicio.eliminarDetalle(idDetalle);
        int reglista = 0;

        for (ListaProductos lproductos : this.listProductos) {
            reglista++;
        }
        if (reglista == 0) {
            this.idCarro = 0;
        }
        System.out.println("numero de registros :" + reglista);
        return "editar";
    }

    /**
     * @return the servicio
     */
    public ejemploBeanLocal getServicio() {
        return servicio;
    }

    public void sumar(ListaProductos p) {
        int cant = p.getCatidadProducto()+1;
        int precio = p.getPrecioProducto();
        String codProducto = p.getCodProducto();
        
        for (ListaProductos producto : this.listProductos) {
            
            if (producto.equals(p)) {
                Producto pro = new Producto();
                pro = servicio.obtenerProducto(codProducto);
                
                if(cant<=pro.getStockProducto() && cant>0){
                   
                   producto.setCatidadProducto(cant);
                   producto.setTotalProducto(cant * precio);  
                }
                

            }
        }

        
        servicio.actualizarCantidadDetalle(p.getIdDetalle(), cant);
    }

    public void restar(ListaProductos p) {
        int cant = p.getCatidadProducto();
        int precio = p.getPrecioProducto();
        String codProducto = p.getCodProducto();
        for (ListaProductos producto : this.listProductos) {
            if (producto.equals(p)) {

                if (cant > 0) {
                    cant--;
                    producto.setCatidadProducto(cant);
                    producto.setTotalProducto(cant * precio);
                }

            }
        }
        
        servicio.actualizarCantidadDetalle(p.getIdDetalle(), cant);
    }

    /**
     * @param servicio
     *            the servicio to set
     */
    public void setServicio(ejemploBeanLocal servicio) {
        this.servicio = servicio;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getlUsuario() {
        return lUsuario;
    }

    public void setlUsuario(List<Usuario> lUsuario) {
        this.lUsuario = lUsuario;
    }

    public List<Producto> getProductoList() {
        return productoList;
    }

    public void setProductoList(List<Producto> productoList) {
        this.productoList = productoList;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public String getPassUsuario() {
        return passUsuario;
    }

    public void setPassUsuario(String passUsuario) {
        this.passUsuario = passUsuario;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    public String getNombreEnSesion() {
        return nombreEnSesion;
    }

    public void setNombreEnSesion(String nombreEnSesion) {
        this.nombreEnSesion = nombreEnSesion;
    }

    public String getPassEnSesion() {
        return passEnSesion;
    }

    public void setPassEnSesion(String passEnSesion) {
        this.passEnSesion = passEnSesion;
    }

    public int getIdCarro() {
        return idCarro;
    }

    public void setIdCarro(int idCarro) {
        this.idCarro = idCarro;
    }

    public List<DetalleCarro> getListDetalle() {
        return listDetalle;
    }

    public void setListDetalle(List<DetalleCarro> listDetalle) {
        this.listDetalle = listDetalle;
    }

    public List<ListaProductos> getListProductos() {
        return listProductos;
    }

    public void setListProductos(List<ListaProductos> listProductos) {
        this.listProductos = listProductos;
    }

}
